How to work with GEDI Level 2B V002 Data¶

This tutorial was developed as a walkthrough at the USFS - NASA JOINT APPLICATIONS WORKSHOP part of Applied Earth Observations Innovation Partneship.¶

This tutorial will show how to use Python to open GEDI L2B Version 2 files, subset layer and to a region of interest, filter by quality, and visualize GEDI Elevation, Canopy Elevation, Plant Area Index,and Canopy Height along with Tandem-X DEM and Non-vegetated area from MODIS.¶

A small area of eastern part of Uinta-Wasatch-Cache National Forest is used as the ROI for this tutorial.¶

Note: follow the steps provided in Prerequisites/Setup Instructions section in README.md

1. Set Up the Working Environment and Retrieve Files¶

Import the required packages and set the input/working directory to run this Jupyter Notebook locally.¶

In [1]:
import os
import h5py
import pandas
import geopandas 
from shapely.geometry import Point
import geoviews
from geoviews import opts, tile_sources as gvts
import shapely
import warnings
from shapely.errors import ShapelyDeprecationWarning
geoviews.extension('bokeh','matplotlib')
warnings.filterwarnings("ignore", category=ShapelyDeprecationWarning) 

Set up the working environment and retrieve GEDI02_B files.¶

Direct link to download GEDI02_B granule used in this workflow:¶

  • https://e4ftl01.cr.usgs.gov//GEDI_L1_L2/GEDI/GEDI02_B.002/2022.04.30/GEDI02_B_2022120091720_O19145_02_T09106_02_003_01_V002.h5?_ga=2.154728634.387355792.1681738783-1969705792.1681738783
In [2]:
inDir = os.getcwd()   # Set input directory to the current working directory
os.chdir(inDir)  
gedi_L2B = [g for g in os.listdir() if g.startswith('GEDI02_B') and g.endswith('.h5')]  # List all GEDI L2B .h5 files in inDir
gedi_L2B
Out[2]:
['GEDI02_B_2022120091720_O19145_02_T09106_02_003_01_V002.h5']

The standard format for GEDI Version 2 filenames is as follows:¶

GEDI02_B: Product Short Name
2022120091720: Julian Date and Time of Acquisition (YYYYDDDHHMMSS)
O19145: Orbit Number
02: Sub-Orbit Granule Number (1-4)
T09106: Track Number (Reference Ground Track)
02: Positioning and Pointing Determination System (PPDS) type (00 is predict, 01 rapid, 02 and higher is final)
003: PGE Version Number
01: Granule Production Version
V002: Product Version

2. Open a GEDI HDF5 File and Read File Metadata¶

Read in a GEDI HDF5 file using the h5py package and navigate the HDF5 file. The GEDI HDF5 file contains groups in which data and metadata are stored.¶

In [3]:
L2B = h5py.File(gedi_L2B[0], 'r')  # Read file using h5py
L2B
Out[3]:
<HDF5 file "GEDI02_B_2022120091720_O19145_02_T09106_02_003_01_V002.h5" (mode r)>
In [4]:
list(L2B.keys())
Out[4]:
['BEAM0000',
 'BEAM0001',
 'BEAM0010',
 'BEAM0011',
 'BEAM0101',
 'BEAM0110',
 'BEAM1000',
 'BEAM1011',
 'METADATA']

The METADATA group contains the file-level metadata such as the creation date, PGEVersion, and VersionID. Below, print the file-level metadata attributes and their values.¶

In [5]:
for g in L2B['METADATA']['DatasetIdentification'].attrs:
    print(g, ':', L2B['METADATA']['DatasetIdentification'].attrs[g]) 
    
PGEVersion : 003
VersionID : 01
abstract : The GEDI L2B standard data product contains precise latitude, longitude, elevation, height, cover and vertical profile metrics for each laser footprint located on the land surface.
characterSet : utf8
creationDate : 2022-08-24T16:16:22.315776Z
credit : The software that generates the L2B product was implemented within the GEDI Science Data Processing System at the NASA Goddard Space Flight Center (GSFC) in Greenbelt, Maryland in collaboration with the Department of Geographical Sciences at the University of Maryland (UMD).
fileName : GEDI02_B_2022120091720_O19145_02_T09106_02_003_01_V002.h5
language : eng
originatorOrganizationName : UMD/GSFC GEDI-SDPS > GEDI Science Data Processing System
purpose : The purpose of the L2B dataset is to extract biophysical metrics from each GEDI waveform. These metrics are based on the directional gap probability profile derived from the L1B waveform and include canopy cover, Plant Area Index (PAI), Plant Area Volume Density (PAVD) and Foliage Height Diversity (FHD).
shortName : GEDI_L2B
spatialRepresentationType : along-track
status : onGoing
topicCategory : geoscientificInformation
uuid : cb5bebb2-6eb6-4d4e-b38f-a017a5b8941e

3. Read SDS Metadata and Subset by Beam¶

The GEDI instrument consists of 3 lasers producing a total of 8 beam ground transects. The eight remaining groups contain data for each of the eight GEDI beam transects. For additional information, be sure to check out: https://gedi.umd.edu/instrument/specifications/.¶

One useful piece of metadata to retrieve from each beam transect is whether it is a full power beam or a coverage beam. GEDI coverage beams will not penetrate dense forest. The GEDI coverage beams were only designed to penetrate canopies of up to 95% canopy cover under “average” conditions, so users should preference use of GEDI power beams in the case of dense forest.¶

In [6]:
for beam in list(L2B.keys()):
    if beam == 'METADATA':
        continue
    else:
        print(beam, 'is:', L2B[beam].attrs['description'])
BEAM0000 is: Coverage beam
BEAM0001 is: Coverage beam
BEAM0010 is: Coverage beam
BEAM0011 is: Coverage beam
BEAM0101 is: Full power beam
BEAM0110 is: Full power beam
BEAM1000 is: Full power beam
BEAM1011 is: Full power beam

Identify all the datasets in the GEDI HDF5 file below.¶

In [7]:
# list(L2B['BEAM1011'].keys())
L2B_objs = []
L2B.visit(L2B_objs.append)                                           # Retrieve list of datasets
SDS = [o for o in L2B_objs if isinstance(L2B[o], h5py.Dataset)]  # Search for relevant SDS inside data file
SDS
Out[7]:
['BEAM0000/algorithmrun_flag',
 'BEAM0000/ancillary/dz',
 'BEAM0000/ancillary/l2a_alg_count',
 'BEAM0000/ancillary/maxheight_cuttoff',
 'BEAM0000/ancillary/rg_eg_constraint_center_buffer',
 'BEAM0000/ancillary/rg_eg_mpfit_max_func_evals',
 'BEAM0000/ancillary/rg_eg_mpfit_maxiters',
 'BEAM0000/ancillary/rg_eg_mpfit_tolerance',
 'BEAM0000/ancillary/signal_search_buff',
 'BEAM0000/ancillary/tx_noise_stddev_multiplier',
 'BEAM0000/beam',
 'BEAM0000/channel',
 'BEAM0000/cover',
 'BEAM0000/cover_z',
 'BEAM0000/fhd_normal',
 'BEAM0000/geolocation/degrade_flag',
 'BEAM0000/geolocation/delta_time',
 'BEAM0000/geolocation/digital_elevation_model',
 'BEAM0000/geolocation/elev_highestreturn',
 'BEAM0000/geolocation/elev_lowestmode',
 'BEAM0000/geolocation/elevation_bin0',
 'BEAM0000/geolocation/elevation_bin0_error',
 'BEAM0000/geolocation/elevation_lastbin',
 'BEAM0000/geolocation/elevation_lastbin_error',
 'BEAM0000/geolocation/height_bin0',
 'BEAM0000/geolocation/height_lastbin',
 'BEAM0000/geolocation/lat_highestreturn',
 'BEAM0000/geolocation/lat_lowestmode',
 'BEAM0000/geolocation/latitude_bin0',
 'BEAM0000/geolocation/latitude_bin0_error',
 'BEAM0000/geolocation/latitude_lastbin',
 'BEAM0000/geolocation/latitude_lastbin_error',
 'BEAM0000/geolocation/local_beam_azimuth',
 'BEAM0000/geolocation/local_beam_elevation',
 'BEAM0000/geolocation/lon_highestreturn',
 'BEAM0000/geolocation/lon_lowestmode',
 'BEAM0000/geolocation/longitude_bin0',
 'BEAM0000/geolocation/longitude_bin0_error',
 'BEAM0000/geolocation/longitude_lastbin',
 'BEAM0000/geolocation/longitude_lastbin_error',
 'BEAM0000/geolocation/shot_number',
 'BEAM0000/geolocation/solar_azimuth',
 'BEAM0000/geolocation/solar_elevation',
 'BEAM0000/l2a_quality_flag',
 'BEAM0000/l2b_quality_flag',
 'BEAM0000/land_cover_data/landsat_treecover',
 'BEAM0000/land_cover_data/landsat_water_persistence',
 'BEAM0000/land_cover_data/leaf_off_doy',
 'BEAM0000/land_cover_data/leaf_off_flag',
 'BEAM0000/land_cover_data/leaf_on_cycle',
 'BEAM0000/land_cover_data/leaf_on_doy',
 'BEAM0000/land_cover_data/modis_nonvegetated',
 'BEAM0000/land_cover_data/modis_nonvegetated_sd',
 'BEAM0000/land_cover_data/modis_treecover',
 'BEAM0000/land_cover_data/modis_treecover_sd',
 'BEAM0000/land_cover_data/pft_class',
 'BEAM0000/land_cover_data/region_class',
 'BEAM0000/land_cover_data/urban_focal_window_size',
 'BEAM0000/land_cover_data/urban_proportion',
 'BEAM0000/master_frac',
 'BEAM0000/master_int',
 'BEAM0000/num_detectedmodes',
 'BEAM0000/omega',
 'BEAM0000/pai',
 'BEAM0000/pai_z',
 'BEAM0000/pavd_z',
 'BEAM0000/pgap_theta',
 'BEAM0000/pgap_theta_error',
 'BEAM0000/pgap_theta_z',
 'BEAM0000/rg',
 'BEAM0000/rh100',
 'BEAM0000/rhog',
 'BEAM0000/rhog_error',
 'BEAM0000/rhov',
 'BEAM0000/rhov_error',
 'BEAM0000/rossg',
 'BEAM0000/rv',
 'BEAM0000/rx_processing/algorithmrun_flag_a1',
 'BEAM0000/rx_processing/algorithmrun_flag_a2',
 'BEAM0000/rx_processing/algorithmrun_flag_a3',
 'BEAM0000/rx_processing/algorithmrun_flag_a4',
 'BEAM0000/rx_processing/algorithmrun_flag_a5',
 'BEAM0000/rx_processing/algorithmrun_flag_a6',
 'BEAM0000/rx_processing/pgap_theta_a1',
 'BEAM0000/rx_processing/pgap_theta_a2',
 'BEAM0000/rx_processing/pgap_theta_a3',
 'BEAM0000/rx_processing/pgap_theta_a4',
 'BEAM0000/rx_processing/pgap_theta_a5',
 'BEAM0000/rx_processing/pgap_theta_a6',
 'BEAM0000/rx_processing/pgap_theta_error_a1',
 'BEAM0000/rx_processing/pgap_theta_error_a2',
 'BEAM0000/rx_processing/pgap_theta_error_a3',
 'BEAM0000/rx_processing/pgap_theta_error_a4',
 'BEAM0000/rx_processing/pgap_theta_error_a5',
 'BEAM0000/rx_processing/pgap_theta_error_a6',
 'BEAM0000/rx_processing/rg_a1',
 'BEAM0000/rx_processing/rg_a2',
 'BEAM0000/rx_processing/rg_a3',
 'BEAM0000/rx_processing/rg_a4',
 'BEAM0000/rx_processing/rg_a5',
 'BEAM0000/rx_processing/rg_a6',
 'BEAM0000/rx_processing/rg_eg_amplitude_a1',
 'BEAM0000/rx_processing/rg_eg_amplitude_a2',
 'BEAM0000/rx_processing/rg_eg_amplitude_a3',
 'BEAM0000/rx_processing/rg_eg_amplitude_a4',
 'BEAM0000/rx_processing/rg_eg_amplitude_a5',
 'BEAM0000/rx_processing/rg_eg_amplitude_a6',
 'BEAM0000/rx_processing/rg_eg_amplitude_error_a1',
 'BEAM0000/rx_processing/rg_eg_amplitude_error_a2',
 'BEAM0000/rx_processing/rg_eg_amplitude_error_a3',
 'BEAM0000/rx_processing/rg_eg_amplitude_error_a4',
 'BEAM0000/rx_processing/rg_eg_amplitude_error_a5',
 'BEAM0000/rx_processing/rg_eg_amplitude_error_a6',
 'BEAM0000/rx_processing/rg_eg_center_a1',
 'BEAM0000/rx_processing/rg_eg_center_a2',
 'BEAM0000/rx_processing/rg_eg_center_a3',
 'BEAM0000/rx_processing/rg_eg_center_a4',
 'BEAM0000/rx_processing/rg_eg_center_a5',
 'BEAM0000/rx_processing/rg_eg_center_a6',
 'BEAM0000/rx_processing/rg_eg_center_error_a1',
 'BEAM0000/rx_processing/rg_eg_center_error_a2',
 'BEAM0000/rx_processing/rg_eg_center_error_a3',
 'BEAM0000/rx_processing/rg_eg_center_error_a4',
 'BEAM0000/rx_processing/rg_eg_center_error_a5',
 'BEAM0000/rx_processing/rg_eg_center_error_a6',
 'BEAM0000/rx_processing/rg_eg_chisq_a1',
 'BEAM0000/rx_processing/rg_eg_chisq_a2',
 'BEAM0000/rx_processing/rg_eg_chisq_a3',
 'BEAM0000/rx_processing/rg_eg_chisq_a4',
 'BEAM0000/rx_processing/rg_eg_chisq_a5',
 'BEAM0000/rx_processing/rg_eg_chisq_a6',
 'BEAM0000/rx_processing/rg_eg_flag_a1',
 'BEAM0000/rx_processing/rg_eg_flag_a2',
 'BEAM0000/rx_processing/rg_eg_flag_a3',
 'BEAM0000/rx_processing/rg_eg_flag_a4',
 'BEAM0000/rx_processing/rg_eg_flag_a5',
 'BEAM0000/rx_processing/rg_eg_flag_a6',
 'BEAM0000/rx_processing/rg_eg_gamma_a1',
 'BEAM0000/rx_processing/rg_eg_gamma_a2',
 'BEAM0000/rx_processing/rg_eg_gamma_a3',
 'BEAM0000/rx_processing/rg_eg_gamma_a4',
 'BEAM0000/rx_processing/rg_eg_gamma_a5',
 'BEAM0000/rx_processing/rg_eg_gamma_a6',
 'BEAM0000/rx_processing/rg_eg_gamma_error_a1',
 'BEAM0000/rx_processing/rg_eg_gamma_error_a2',
 'BEAM0000/rx_processing/rg_eg_gamma_error_a3',
 'BEAM0000/rx_processing/rg_eg_gamma_error_a4',
 'BEAM0000/rx_processing/rg_eg_gamma_error_a5',
 'BEAM0000/rx_processing/rg_eg_gamma_error_a6',
 'BEAM0000/rx_processing/rg_eg_niter_a1',
 'BEAM0000/rx_processing/rg_eg_niter_a2',
 'BEAM0000/rx_processing/rg_eg_niter_a3',
 'BEAM0000/rx_processing/rg_eg_niter_a4',
 'BEAM0000/rx_processing/rg_eg_niter_a5',
 'BEAM0000/rx_processing/rg_eg_niter_a6',
 'BEAM0000/rx_processing/rg_eg_sigma_a1',
 'BEAM0000/rx_processing/rg_eg_sigma_a2',
 'BEAM0000/rx_processing/rg_eg_sigma_a3',
 'BEAM0000/rx_processing/rg_eg_sigma_a4',
 'BEAM0000/rx_processing/rg_eg_sigma_a5',
 'BEAM0000/rx_processing/rg_eg_sigma_a6',
 'BEAM0000/rx_processing/rg_eg_sigma_error_a1',
 'BEAM0000/rx_processing/rg_eg_sigma_error_a2',
 'BEAM0000/rx_processing/rg_eg_sigma_error_a3',
 'BEAM0000/rx_processing/rg_eg_sigma_error_a4',
 'BEAM0000/rx_processing/rg_eg_sigma_error_a5',
 'BEAM0000/rx_processing/rg_eg_sigma_error_a6',
 'BEAM0000/rx_processing/rg_error_a1',
 'BEAM0000/rx_processing/rg_error_a2',
 'BEAM0000/rx_processing/rg_error_a3',
 'BEAM0000/rx_processing/rg_error_a4',
 'BEAM0000/rx_processing/rg_error_a5',
 'BEAM0000/rx_processing/rg_error_a6',
 'BEAM0000/rx_processing/rv_a1',
 'BEAM0000/rx_processing/rv_a2',
 'BEAM0000/rx_processing/rv_a3',
 'BEAM0000/rx_processing/rv_a4',
 'BEAM0000/rx_processing/rv_a5',
 'BEAM0000/rx_processing/rv_a6',
 'BEAM0000/rx_processing/rx_energy_a1',
 'BEAM0000/rx_processing/rx_energy_a2',
 'BEAM0000/rx_processing/rx_energy_a3',
 'BEAM0000/rx_processing/rx_energy_a4',
 'BEAM0000/rx_processing/rx_energy_a5',
 'BEAM0000/rx_processing/rx_energy_a6',
 'BEAM0000/rx_processing/shot_number',
 'BEAM0000/rx_range_highestreturn',
 'BEAM0000/rx_sample_count',
 'BEAM0000/rx_sample_start_index',
 'BEAM0000/selected_l2a_algorithm',
 'BEAM0000/selected_mode',
 'BEAM0000/selected_mode_flag',
 'BEAM0000/selected_rg_algorithm',
 'BEAM0000/sensitivity',
 'BEAM0000/shot_number',
 'BEAM0000/stale_return_flag',
 'BEAM0000/surface_flag',
 'BEAM0001/algorithmrun_flag',
 'BEAM0001/ancillary/dz',
 'BEAM0001/ancillary/l2a_alg_count',
 'BEAM0001/ancillary/maxheight_cuttoff',
 'BEAM0001/ancillary/rg_eg_constraint_center_buffer',
 'BEAM0001/ancillary/rg_eg_mpfit_max_func_evals',
 'BEAM0001/ancillary/rg_eg_mpfit_maxiters',
 'BEAM0001/ancillary/rg_eg_mpfit_tolerance',
 'BEAM0001/ancillary/signal_search_buff',
 'BEAM0001/ancillary/tx_noise_stddev_multiplier',
 'BEAM0001/beam',
 'BEAM0001/channel',
 'BEAM0001/cover',
 'BEAM0001/cover_z',
 'BEAM0001/fhd_normal',
 'BEAM0001/geolocation/degrade_flag',
 'BEAM0001/geolocation/delta_time',
 'BEAM0001/geolocation/digital_elevation_model',
 'BEAM0001/geolocation/elev_highestreturn',
 'BEAM0001/geolocation/elev_lowestmode',
 'BEAM0001/geolocation/elevation_bin0',
 'BEAM0001/geolocation/elevation_bin0_error',
 'BEAM0001/geolocation/elevation_lastbin',
 'BEAM0001/geolocation/elevation_lastbin_error',
 'BEAM0001/geolocation/height_bin0',
 'BEAM0001/geolocation/height_lastbin',
 'BEAM0001/geolocation/lat_highestreturn',
 'BEAM0001/geolocation/lat_lowestmode',
 'BEAM0001/geolocation/latitude_bin0',
 'BEAM0001/geolocation/latitude_bin0_error',
 'BEAM0001/geolocation/latitude_lastbin',
 'BEAM0001/geolocation/latitude_lastbin_error',
 'BEAM0001/geolocation/local_beam_azimuth',
 'BEAM0001/geolocation/local_beam_elevation',
 'BEAM0001/geolocation/lon_highestreturn',
 'BEAM0001/geolocation/lon_lowestmode',
 'BEAM0001/geolocation/longitude_bin0',
 'BEAM0001/geolocation/longitude_bin0_error',
 'BEAM0001/geolocation/longitude_lastbin',
 'BEAM0001/geolocation/longitude_lastbin_error',
 'BEAM0001/geolocation/shot_number',
 'BEAM0001/geolocation/solar_azimuth',
 'BEAM0001/geolocation/solar_elevation',
 'BEAM0001/l2a_quality_flag',
 'BEAM0001/l2b_quality_flag',
 'BEAM0001/land_cover_data/landsat_treecover',
 'BEAM0001/land_cover_data/landsat_water_persistence',
 'BEAM0001/land_cover_data/leaf_off_doy',
 'BEAM0001/land_cover_data/leaf_off_flag',
 'BEAM0001/land_cover_data/leaf_on_cycle',
 'BEAM0001/land_cover_data/leaf_on_doy',
 'BEAM0001/land_cover_data/modis_nonvegetated',
 'BEAM0001/land_cover_data/modis_nonvegetated_sd',
 'BEAM0001/land_cover_data/modis_treecover',
 'BEAM0001/land_cover_data/modis_treecover_sd',
 'BEAM0001/land_cover_data/pft_class',
 'BEAM0001/land_cover_data/region_class',
 'BEAM0001/land_cover_data/urban_focal_window_size',
 'BEAM0001/land_cover_data/urban_proportion',
 'BEAM0001/master_frac',
 'BEAM0001/master_int',
 'BEAM0001/num_detectedmodes',
 'BEAM0001/omega',
 'BEAM0001/pai',
 'BEAM0001/pai_z',
 'BEAM0001/pavd_z',
 'BEAM0001/pgap_theta',
 'BEAM0001/pgap_theta_error',
 'BEAM0001/pgap_theta_z',
 'BEAM0001/rg',
 'BEAM0001/rh100',
 'BEAM0001/rhog',
 'BEAM0001/rhog_error',
 'BEAM0001/rhov',
 'BEAM0001/rhov_error',
 'BEAM0001/rossg',
 'BEAM0001/rv',
 'BEAM0001/rx_processing/algorithmrun_flag_a1',
 'BEAM0001/rx_processing/algorithmrun_flag_a2',
 'BEAM0001/rx_processing/algorithmrun_flag_a3',
 'BEAM0001/rx_processing/algorithmrun_flag_a4',
 'BEAM0001/rx_processing/algorithmrun_flag_a5',
 'BEAM0001/rx_processing/algorithmrun_flag_a6',
 'BEAM0001/rx_processing/pgap_theta_a1',
 'BEAM0001/rx_processing/pgap_theta_a2',
 'BEAM0001/rx_processing/pgap_theta_a3',
 'BEAM0001/rx_processing/pgap_theta_a4',
 'BEAM0001/rx_processing/pgap_theta_a5',
 'BEAM0001/rx_processing/pgap_theta_a6',
 'BEAM0001/rx_processing/pgap_theta_error_a1',
 'BEAM0001/rx_processing/pgap_theta_error_a2',
 'BEAM0001/rx_processing/pgap_theta_error_a3',
 'BEAM0001/rx_processing/pgap_theta_error_a4',
 'BEAM0001/rx_processing/pgap_theta_error_a5',
 'BEAM0001/rx_processing/pgap_theta_error_a6',
 'BEAM0001/rx_processing/rg_a1',
 'BEAM0001/rx_processing/rg_a2',
 'BEAM0001/rx_processing/rg_a3',
 'BEAM0001/rx_processing/rg_a4',
 'BEAM0001/rx_processing/rg_a5',
 'BEAM0001/rx_processing/rg_a6',
 'BEAM0001/rx_processing/rg_eg_amplitude_a1',
 'BEAM0001/rx_processing/rg_eg_amplitude_a2',
 'BEAM0001/rx_processing/rg_eg_amplitude_a3',
 'BEAM0001/rx_processing/rg_eg_amplitude_a4',
 'BEAM0001/rx_processing/rg_eg_amplitude_a5',
 'BEAM0001/rx_processing/rg_eg_amplitude_a6',
 'BEAM0001/rx_processing/rg_eg_amplitude_error_a1',
 'BEAM0001/rx_processing/rg_eg_amplitude_error_a2',
 'BEAM0001/rx_processing/rg_eg_amplitude_error_a3',
 'BEAM0001/rx_processing/rg_eg_amplitude_error_a4',
 'BEAM0001/rx_processing/rg_eg_amplitude_error_a5',
 'BEAM0001/rx_processing/rg_eg_amplitude_error_a6',
 'BEAM0001/rx_processing/rg_eg_center_a1',
 'BEAM0001/rx_processing/rg_eg_center_a2',
 'BEAM0001/rx_processing/rg_eg_center_a3',
 'BEAM0001/rx_processing/rg_eg_center_a4',
 'BEAM0001/rx_processing/rg_eg_center_a5',
 'BEAM0001/rx_processing/rg_eg_center_a6',
 'BEAM0001/rx_processing/rg_eg_center_error_a1',
 'BEAM0001/rx_processing/rg_eg_center_error_a2',
 'BEAM0001/rx_processing/rg_eg_center_error_a3',
 'BEAM0001/rx_processing/rg_eg_center_error_a4',
 'BEAM0001/rx_processing/rg_eg_center_error_a5',
 'BEAM0001/rx_processing/rg_eg_center_error_a6',
 'BEAM0001/rx_processing/rg_eg_chisq_a1',
 'BEAM0001/rx_processing/rg_eg_chisq_a2',
 'BEAM0001/rx_processing/rg_eg_chisq_a3',
 'BEAM0001/rx_processing/rg_eg_chisq_a4',
 'BEAM0001/rx_processing/rg_eg_chisq_a5',
 'BEAM0001/rx_processing/rg_eg_chisq_a6',
 'BEAM0001/rx_processing/rg_eg_flag_a1',
 'BEAM0001/rx_processing/rg_eg_flag_a2',
 'BEAM0001/rx_processing/rg_eg_flag_a3',
 'BEAM0001/rx_processing/rg_eg_flag_a4',
 'BEAM0001/rx_processing/rg_eg_flag_a5',
 'BEAM0001/rx_processing/rg_eg_flag_a6',
 'BEAM0001/rx_processing/rg_eg_gamma_a1',
 'BEAM0001/rx_processing/rg_eg_gamma_a2',
 'BEAM0001/rx_processing/rg_eg_gamma_a3',
 'BEAM0001/rx_processing/rg_eg_gamma_a4',
 'BEAM0001/rx_processing/rg_eg_gamma_a5',
 'BEAM0001/rx_processing/rg_eg_gamma_a6',
 'BEAM0001/rx_processing/rg_eg_gamma_error_a1',
 'BEAM0001/rx_processing/rg_eg_gamma_error_a2',
 'BEAM0001/rx_processing/rg_eg_gamma_error_a3',
 'BEAM0001/rx_processing/rg_eg_gamma_error_a4',
 'BEAM0001/rx_processing/rg_eg_gamma_error_a5',
 'BEAM0001/rx_processing/rg_eg_gamma_error_a6',
 'BEAM0001/rx_processing/rg_eg_niter_a1',
 'BEAM0001/rx_processing/rg_eg_niter_a2',
 'BEAM0001/rx_processing/rg_eg_niter_a3',
 'BEAM0001/rx_processing/rg_eg_niter_a4',
 'BEAM0001/rx_processing/rg_eg_niter_a5',
 'BEAM0001/rx_processing/rg_eg_niter_a6',
 'BEAM0001/rx_processing/rg_eg_sigma_a1',
 'BEAM0001/rx_processing/rg_eg_sigma_a2',
 'BEAM0001/rx_processing/rg_eg_sigma_a3',
 'BEAM0001/rx_processing/rg_eg_sigma_a4',
 'BEAM0001/rx_processing/rg_eg_sigma_a5',
 'BEAM0001/rx_processing/rg_eg_sigma_a6',
 'BEAM0001/rx_processing/rg_eg_sigma_error_a1',
 'BEAM0001/rx_processing/rg_eg_sigma_error_a2',
 'BEAM0001/rx_processing/rg_eg_sigma_error_a3',
 'BEAM0001/rx_processing/rg_eg_sigma_error_a4',
 'BEAM0001/rx_processing/rg_eg_sigma_error_a5',
 'BEAM0001/rx_processing/rg_eg_sigma_error_a6',
 'BEAM0001/rx_processing/rg_error_a1',
 'BEAM0001/rx_processing/rg_error_a2',
 'BEAM0001/rx_processing/rg_error_a3',
 'BEAM0001/rx_processing/rg_error_a4',
 'BEAM0001/rx_processing/rg_error_a5',
 'BEAM0001/rx_processing/rg_error_a6',
 'BEAM0001/rx_processing/rv_a1',
 'BEAM0001/rx_processing/rv_a2',
 'BEAM0001/rx_processing/rv_a3',
 'BEAM0001/rx_processing/rv_a4',
 'BEAM0001/rx_processing/rv_a5',
 'BEAM0001/rx_processing/rv_a6',
 'BEAM0001/rx_processing/rx_energy_a1',
 'BEAM0001/rx_processing/rx_energy_a2',
 'BEAM0001/rx_processing/rx_energy_a3',
 'BEAM0001/rx_processing/rx_energy_a4',
 'BEAM0001/rx_processing/rx_energy_a5',
 'BEAM0001/rx_processing/rx_energy_a6',
 'BEAM0001/rx_processing/shot_number',
 'BEAM0001/rx_range_highestreturn',
 'BEAM0001/rx_sample_count',
 'BEAM0001/rx_sample_start_index',
 'BEAM0001/selected_l2a_algorithm',
 'BEAM0001/selected_mode',
 'BEAM0001/selected_mode_flag',
 'BEAM0001/selected_rg_algorithm',
 'BEAM0001/sensitivity',
 'BEAM0001/shot_number',
 'BEAM0001/stale_return_flag',
 'BEAM0001/surface_flag',
 'BEAM0010/algorithmrun_flag',
 'BEAM0010/ancillary/dz',
 'BEAM0010/ancillary/l2a_alg_count',
 'BEAM0010/ancillary/maxheight_cuttoff',
 'BEAM0010/ancillary/rg_eg_constraint_center_buffer',
 'BEAM0010/ancillary/rg_eg_mpfit_max_func_evals',
 'BEAM0010/ancillary/rg_eg_mpfit_maxiters',
 'BEAM0010/ancillary/rg_eg_mpfit_tolerance',
 'BEAM0010/ancillary/signal_search_buff',
 'BEAM0010/ancillary/tx_noise_stddev_multiplier',
 'BEAM0010/beam',
 'BEAM0010/channel',
 'BEAM0010/cover',
 'BEAM0010/cover_z',
 'BEAM0010/fhd_normal',
 'BEAM0010/geolocation/degrade_flag',
 'BEAM0010/geolocation/delta_time',
 'BEAM0010/geolocation/digital_elevation_model',
 'BEAM0010/geolocation/elev_highestreturn',
 'BEAM0010/geolocation/elev_lowestmode',
 'BEAM0010/geolocation/elevation_bin0',
 'BEAM0010/geolocation/elevation_bin0_error',
 'BEAM0010/geolocation/elevation_lastbin',
 'BEAM0010/geolocation/elevation_lastbin_error',
 'BEAM0010/geolocation/height_bin0',
 'BEAM0010/geolocation/height_lastbin',
 'BEAM0010/geolocation/lat_highestreturn',
 'BEAM0010/geolocation/lat_lowestmode',
 'BEAM0010/geolocation/latitude_bin0',
 'BEAM0010/geolocation/latitude_bin0_error',
 'BEAM0010/geolocation/latitude_lastbin',
 'BEAM0010/geolocation/latitude_lastbin_error',
 'BEAM0010/geolocation/local_beam_azimuth',
 'BEAM0010/geolocation/local_beam_elevation',
 'BEAM0010/geolocation/lon_highestreturn',
 'BEAM0010/geolocation/lon_lowestmode',
 'BEAM0010/geolocation/longitude_bin0',
 'BEAM0010/geolocation/longitude_bin0_error',
 'BEAM0010/geolocation/longitude_lastbin',
 'BEAM0010/geolocation/longitude_lastbin_error',
 'BEAM0010/geolocation/shot_number',
 'BEAM0010/geolocation/solar_azimuth',
 'BEAM0010/geolocation/solar_elevation',
 'BEAM0010/l2a_quality_flag',
 'BEAM0010/l2b_quality_flag',
 'BEAM0010/land_cover_data/landsat_treecover',
 'BEAM0010/land_cover_data/landsat_water_persistence',
 'BEAM0010/land_cover_data/leaf_off_doy',
 'BEAM0010/land_cover_data/leaf_off_flag',
 'BEAM0010/land_cover_data/leaf_on_cycle',
 'BEAM0010/land_cover_data/leaf_on_doy',
 'BEAM0010/land_cover_data/modis_nonvegetated',
 'BEAM0010/land_cover_data/modis_nonvegetated_sd',
 'BEAM0010/land_cover_data/modis_treecover',
 'BEAM0010/land_cover_data/modis_treecover_sd',
 'BEAM0010/land_cover_data/pft_class',
 'BEAM0010/land_cover_data/region_class',
 'BEAM0010/land_cover_data/urban_focal_window_size',
 'BEAM0010/land_cover_data/urban_proportion',
 'BEAM0010/master_frac',
 'BEAM0010/master_int',
 'BEAM0010/num_detectedmodes',
 'BEAM0010/omega',
 'BEAM0010/pai',
 'BEAM0010/pai_z',
 'BEAM0010/pavd_z',
 'BEAM0010/pgap_theta',
 'BEAM0010/pgap_theta_error',
 'BEAM0010/pgap_theta_z',
 'BEAM0010/rg',
 'BEAM0010/rh100',
 'BEAM0010/rhog',
 'BEAM0010/rhog_error',
 'BEAM0010/rhov',
 'BEAM0010/rhov_error',
 'BEAM0010/rossg',
 'BEAM0010/rv',
 'BEAM0010/rx_processing/algorithmrun_flag_a1',
 'BEAM0010/rx_processing/algorithmrun_flag_a2',
 'BEAM0010/rx_processing/algorithmrun_flag_a3',
 'BEAM0010/rx_processing/algorithmrun_flag_a4',
 'BEAM0010/rx_processing/algorithmrun_flag_a5',
 'BEAM0010/rx_processing/algorithmrun_flag_a6',
 'BEAM0010/rx_processing/pgap_theta_a1',
 'BEAM0010/rx_processing/pgap_theta_a2',
 'BEAM0010/rx_processing/pgap_theta_a3',
 'BEAM0010/rx_processing/pgap_theta_a4',
 'BEAM0010/rx_processing/pgap_theta_a5',
 'BEAM0010/rx_processing/pgap_theta_a6',
 'BEAM0010/rx_processing/pgap_theta_error_a1',
 'BEAM0010/rx_processing/pgap_theta_error_a2',
 'BEAM0010/rx_processing/pgap_theta_error_a3',
 'BEAM0010/rx_processing/pgap_theta_error_a4',
 'BEAM0010/rx_processing/pgap_theta_error_a5',
 'BEAM0010/rx_processing/pgap_theta_error_a6',
 'BEAM0010/rx_processing/rg_a1',
 'BEAM0010/rx_processing/rg_a2',
 'BEAM0010/rx_processing/rg_a3',
 'BEAM0010/rx_processing/rg_a4',
 'BEAM0010/rx_processing/rg_a5',
 'BEAM0010/rx_processing/rg_a6',
 'BEAM0010/rx_processing/rg_eg_amplitude_a1',
 'BEAM0010/rx_processing/rg_eg_amplitude_a2',
 'BEAM0010/rx_processing/rg_eg_amplitude_a3',
 'BEAM0010/rx_processing/rg_eg_amplitude_a4',
 'BEAM0010/rx_processing/rg_eg_amplitude_a5',
 'BEAM0010/rx_processing/rg_eg_amplitude_a6',
 'BEAM0010/rx_processing/rg_eg_amplitude_error_a1',
 'BEAM0010/rx_processing/rg_eg_amplitude_error_a2',
 'BEAM0010/rx_processing/rg_eg_amplitude_error_a3',
 'BEAM0010/rx_processing/rg_eg_amplitude_error_a4',
 'BEAM0010/rx_processing/rg_eg_amplitude_error_a5',
 'BEAM0010/rx_processing/rg_eg_amplitude_error_a6',
 'BEAM0010/rx_processing/rg_eg_center_a1',
 'BEAM0010/rx_processing/rg_eg_center_a2',
 'BEAM0010/rx_processing/rg_eg_center_a3',
 'BEAM0010/rx_processing/rg_eg_center_a4',
 'BEAM0010/rx_processing/rg_eg_center_a5',
 'BEAM0010/rx_processing/rg_eg_center_a6',
 'BEAM0010/rx_processing/rg_eg_center_error_a1',
 'BEAM0010/rx_processing/rg_eg_center_error_a2',
 'BEAM0010/rx_processing/rg_eg_center_error_a3',
 'BEAM0010/rx_processing/rg_eg_center_error_a4',
 'BEAM0010/rx_processing/rg_eg_center_error_a5',
 'BEAM0010/rx_processing/rg_eg_center_error_a6',
 'BEAM0010/rx_processing/rg_eg_chisq_a1',
 'BEAM0010/rx_processing/rg_eg_chisq_a2',
 'BEAM0010/rx_processing/rg_eg_chisq_a3',
 'BEAM0010/rx_processing/rg_eg_chisq_a4',
 'BEAM0010/rx_processing/rg_eg_chisq_a5',
 'BEAM0010/rx_processing/rg_eg_chisq_a6',
 'BEAM0010/rx_processing/rg_eg_flag_a1',
 'BEAM0010/rx_processing/rg_eg_flag_a2',
 'BEAM0010/rx_processing/rg_eg_flag_a3',
 'BEAM0010/rx_processing/rg_eg_flag_a4',
 'BEAM0010/rx_processing/rg_eg_flag_a5',
 'BEAM0010/rx_processing/rg_eg_flag_a6',
 'BEAM0010/rx_processing/rg_eg_gamma_a1',
 'BEAM0010/rx_processing/rg_eg_gamma_a2',
 'BEAM0010/rx_processing/rg_eg_gamma_a3',
 'BEAM0010/rx_processing/rg_eg_gamma_a4',
 'BEAM0010/rx_processing/rg_eg_gamma_a5',
 'BEAM0010/rx_processing/rg_eg_gamma_a6',
 'BEAM0010/rx_processing/rg_eg_gamma_error_a1',
 'BEAM0010/rx_processing/rg_eg_gamma_error_a2',
 'BEAM0010/rx_processing/rg_eg_gamma_error_a3',
 'BEAM0010/rx_processing/rg_eg_gamma_error_a4',
 'BEAM0010/rx_processing/rg_eg_gamma_error_a5',
 'BEAM0010/rx_processing/rg_eg_gamma_error_a6',
 'BEAM0010/rx_processing/rg_eg_niter_a1',
 'BEAM0010/rx_processing/rg_eg_niter_a2',
 'BEAM0010/rx_processing/rg_eg_niter_a3',
 'BEAM0010/rx_processing/rg_eg_niter_a4',
 'BEAM0010/rx_processing/rg_eg_niter_a5',
 'BEAM0010/rx_processing/rg_eg_niter_a6',
 'BEAM0010/rx_processing/rg_eg_sigma_a1',
 'BEAM0010/rx_processing/rg_eg_sigma_a2',
 'BEAM0010/rx_processing/rg_eg_sigma_a3',
 'BEAM0010/rx_processing/rg_eg_sigma_a4',
 'BEAM0010/rx_processing/rg_eg_sigma_a5',
 'BEAM0010/rx_processing/rg_eg_sigma_a6',
 'BEAM0010/rx_processing/rg_eg_sigma_error_a1',
 'BEAM0010/rx_processing/rg_eg_sigma_error_a2',
 'BEAM0010/rx_processing/rg_eg_sigma_error_a3',
 'BEAM0010/rx_processing/rg_eg_sigma_error_a4',
 'BEAM0010/rx_processing/rg_eg_sigma_error_a5',
 'BEAM0010/rx_processing/rg_eg_sigma_error_a6',
 'BEAM0010/rx_processing/rg_error_a1',
 'BEAM0010/rx_processing/rg_error_a2',
 'BEAM0010/rx_processing/rg_error_a3',
 'BEAM0010/rx_processing/rg_error_a4',
 'BEAM0010/rx_processing/rg_error_a5',
 'BEAM0010/rx_processing/rg_error_a6',
 'BEAM0010/rx_processing/rv_a1',
 'BEAM0010/rx_processing/rv_a2',
 'BEAM0010/rx_processing/rv_a3',
 'BEAM0010/rx_processing/rv_a4',
 'BEAM0010/rx_processing/rv_a5',
 'BEAM0010/rx_processing/rv_a6',
 'BEAM0010/rx_processing/rx_energy_a1',
 'BEAM0010/rx_processing/rx_energy_a2',
 'BEAM0010/rx_processing/rx_energy_a3',
 'BEAM0010/rx_processing/rx_energy_a4',
 'BEAM0010/rx_processing/rx_energy_a5',
 'BEAM0010/rx_processing/rx_energy_a6',
 'BEAM0010/rx_processing/shot_number',
 'BEAM0010/rx_range_highestreturn',
 'BEAM0010/rx_sample_count',
 'BEAM0010/rx_sample_start_index',
 'BEAM0010/selected_l2a_algorithm',
 'BEAM0010/selected_mode',
 'BEAM0010/selected_mode_flag',
 'BEAM0010/selected_rg_algorithm',
 'BEAM0010/sensitivity',
 'BEAM0010/shot_number',
 'BEAM0010/stale_return_flag',
 'BEAM0010/surface_flag',
 'BEAM0011/algorithmrun_flag',
 'BEAM0011/ancillary/dz',
 'BEAM0011/ancillary/l2a_alg_count',
 'BEAM0011/ancillary/maxheight_cuttoff',
 'BEAM0011/ancillary/rg_eg_constraint_center_buffer',
 'BEAM0011/ancillary/rg_eg_mpfit_max_func_evals',
 'BEAM0011/ancillary/rg_eg_mpfit_maxiters',
 'BEAM0011/ancillary/rg_eg_mpfit_tolerance',
 'BEAM0011/ancillary/signal_search_buff',
 'BEAM0011/ancillary/tx_noise_stddev_multiplier',
 'BEAM0011/beam',
 'BEAM0011/channel',
 'BEAM0011/cover',
 'BEAM0011/cover_z',
 'BEAM0011/fhd_normal',
 'BEAM0011/geolocation/degrade_flag',
 'BEAM0011/geolocation/delta_time',
 'BEAM0011/geolocation/digital_elevation_model',
 'BEAM0011/geolocation/elev_highestreturn',
 'BEAM0011/geolocation/elev_lowestmode',
 'BEAM0011/geolocation/elevation_bin0',
 'BEAM0011/geolocation/elevation_bin0_error',
 'BEAM0011/geolocation/elevation_lastbin',
 'BEAM0011/geolocation/elevation_lastbin_error',
 'BEAM0011/geolocation/height_bin0',
 'BEAM0011/geolocation/height_lastbin',
 'BEAM0011/geolocation/lat_highestreturn',
 'BEAM0011/geolocation/lat_lowestmode',
 'BEAM0011/geolocation/latitude_bin0',
 'BEAM0011/geolocation/latitude_bin0_error',
 'BEAM0011/geolocation/latitude_lastbin',
 'BEAM0011/geolocation/latitude_lastbin_error',
 'BEAM0011/geolocation/local_beam_azimuth',
 'BEAM0011/geolocation/local_beam_elevation',
 'BEAM0011/geolocation/lon_highestreturn',
 'BEAM0011/geolocation/lon_lowestmode',
 'BEAM0011/geolocation/longitude_bin0',
 'BEAM0011/geolocation/longitude_bin0_error',
 'BEAM0011/geolocation/longitude_lastbin',
 'BEAM0011/geolocation/longitude_lastbin_error',
 'BEAM0011/geolocation/shot_number',
 'BEAM0011/geolocation/solar_azimuth',
 'BEAM0011/geolocation/solar_elevation',
 'BEAM0011/l2a_quality_flag',
 'BEAM0011/l2b_quality_flag',
 'BEAM0011/land_cover_data/landsat_treecover',
 'BEAM0011/land_cover_data/landsat_water_persistence',
 'BEAM0011/land_cover_data/leaf_off_doy',
 'BEAM0011/land_cover_data/leaf_off_flag',
 'BEAM0011/land_cover_data/leaf_on_cycle',
 'BEAM0011/land_cover_data/leaf_on_doy',
 'BEAM0011/land_cover_data/modis_nonvegetated',
 'BEAM0011/land_cover_data/modis_nonvegetated_sd',
 'BEAM0011/land_cover_data/modis_treecover',
 'BEAM0011/land_cover_data/modis_treecover_sd',
 'BEAM0011/land_cover_data/pft_class',
 'BEAM0011/land_cover_data/region_class',
 'BEAM0011/land_cover_data/urban_focal_window_size',
 'BEAM0011/land_cover_data/urban_proportion',
 'BEAM0011/master_frac',
 'BEAM0011/master_int',
 'BEAM0011/num_detectedmodes',
 'BEAM0011/omega',
 'BEAM0011/pai',
 'BEAM0011/pai_z',
 'BEAM0011/pavd_z',
 'BEAM0011/pgap_theta',
 'BEAM0011/pgap_theta_error',
 'BEAM0011/pgap_theta_z',
 'BEAM0011/rg',
 'BEAM0011/rh100',
 'BEAM0011/rhog',
 'BEAM0011/rhog_error',
 'BEAM0011/rhov',
 'BEAM0011/rhov_error',
 'BEAM0011/rossg',
 'BEAM0011/rv',
 'BEAM0011/rx_processing/algorithmrun_flag_a1',
 'BEAM0011/rx_processing/algorithmrun_flag_a2',
 'BEAM0011/rx_processing/algorithmrun_flag_a3',
 'BEAM0011/rx_processing/algorithmrun_flag_a4',
 'BEAM0011/rx_processing/algorithmrun_flag_a5',
 'BEAM0011/rx_processing/algorithmrun_flag_a6',
 'BEAM0011/rx_processing/pgap_theta_a1',
 'BEAM0011/rx_processing/pgap_theta_a2',
 'BEAM0011/rx_processing/pgap_theta_a3',
 'BEAM0011/rx_processing/pgap_theta_a4',
 'BEAM0011/rx_processing/pgap_theta_a5',
 'BEAM0011/rx_processing/pgap_theta_a6',
 'BEAM0011/rx_processing/pgap_theta_error_a1',
 'BEAM0011/rx_processing/pgap_theta_error_a2',
 'BEAM0011/rx_processing/pgap_theta_error_a3',
 'BEAM0011/rx_processing/pgap_theta_error_a4',
 'BEAM0011/rx_processing/pgap_theta_error_a5',
 'BEAM0011/rx_processing/pgap_theta_error_a6',
 'BEAM0011/rx_processing/rg_a1',
 'BEAM0011/rx_processing/rg_a2',
 'BEAM0011/rx_processing/rg_a3',
 'BEAM0011/rx_processing/rg_a4',
 'BEAM0011/rx_processing/rg_a5',
 'BEAM0011/rx_processing/rg_a6',
 'BEAM0011/rx_processing/rg_eg_amplitude_a1',
 'BEAM0011/rx_processing/rg_eg_amplitude_a2',
 'BEAM0011/rx_processing/rg_eg_amplitude_a3',
 'BEAM0011/rx_processing/rg_eg_amplitude_a4',
 'BEAM0011/rx_processing/rg_eg_amplitude_a5',
 'BEAM0011/rx_processing/rg_eg_amplitude_a6',
 'BEAM0011/rx_processing/rg_eg_amplitude_error_a1',
 'BEAM0011/rx_processing/rg_eg_amplitude_error_a2',
 'BEAM0011/rx_processing/rg_eg_amplitude_error_a3',
 'BEAM0011/rx_processing/rg_eg_amplitude_error_a4',
 'BEAM0011/rx_processing/rg_eg_amplitude_error_a5',
 'BEAM0011/rx_processing/rg_eg_amplitude_error_a6',
 'BEAM0011/rx_processing/rg_eg_center_a1',
 'BEAM0011/rx_processing/rg_eg_center_a2',
 'BEAM0011/rx_processing/rg_eg_center_a3',
 'BEAM0011/rx_processing/rg_eg_center_a4',
 'BEAM0011/rx_processing/rg_eg_center_a5',
 'BEAM0011/rx_processing/rg_eg_center_a6',
 'BEAM0011/rx_processing/rg_eg_center_error_a1',
 'BEAM0011/rx_processing/rg_eg_center_error_a2',
 'BEAM0011/rx_processing/rg_eg_center_error_a3',
 'BEAM0011/rx_processing/rg_eg_center_error_a4',
 'BEAM0011/rx_processing/rg_eg_center_error_a5',
 'BEAM0011/rx_processing/rg_eg_center_error_a6',
 'BEAM0011/rx_processing/rg_eg_chisq_a1',
 'BEAM0011/rx_processing/rg_eg_chisq_a2',
 'BEAM0011/rx_processing/rg_eg_chisq_a3',
 'BEAM0011/rx_processing/rg_eg_chisq_a4',
 'BEAM0011/rx_processing/rg_eg_chisq_a5',
 'BEAM0011/rx_processing/rg_eg_chisq_a6',
 'BEAM0011/rx_processing/rg_eg_flag_a1',
 'BEAM0011/rx_processing/rg_eg_flag_a2',
 'BEAM0011/rx_processing/rg_eg_flag_a3',
 'BEAM0011/rx_processing/rg_eg_flag_a4',
 'BEAM0011/rx_processing/rg_eg_flag_a5',
 'BEAM0011/rx_processing/rg_eg_flag_a6',
 'BEAM0011/rx_processing/rg_eg_gamma_a1',
 'BEAM0011/rx_processing/rg_eg_gamma_a2',
 'BEAM0011/rx_processing/rg_eg_gamma_a3',
 'BEAM0011/rx_processing/rg_eg_gamma_a4',
 'BEAM0011/rx_processing/rg_eg_gamma_a5',
 'BEAM0011/rx_processing/rg_eg_gamma_a6',
 'BEAM0011/rx_processing/rg_eg_gamma_error_a1',
 'BEAM0011/rx_processing/rg_eg_gamma_error_a2',
 'BEAM0011/rx_processing/rg_eg_gamma_error_a3',
 'BEAM0011/rx_processing/rg_eg_gamma_error_a4',
 'BEAM0011/rx_processing/rg_eg_gamma_error_a5',
 'BEAM0011/rx_processing/rg_eg_gamma_error_a6',
 'BEAM0011/rx_processing/rg_eg_niter_a1',
 'BEAM0011/rx_processing/rg_eg_niter_a2',
 'BEAM0011/rx_processing/rg_eg_niter_a3',
 'BEAM0011/rx_processing/rg_eg_niter_a4',
 'BEAM0011/rx_processing/rg_eg_niter_a5',
 'BEAM0011/rx_processing/rg_eg_niter_a6',
 'BEAM0011/rx_processing/rg_eg_sigma_a1',
 'BEAM0011/rx_processing/rg_eg_sigma_a2',
 'BEAM0011/rx_processing/rg_eg_sigma_a3',
 'BEAM0011/rx_processing/rg_eg_sigma_a4',
 'BEAM0011/rx_processing/rg_eg_sigma_a5',
 'BEAM0011/rx_processing/rg_eg_sigma_a6',
 'BEAM0011/rx_processing/rg_eg_sigma_error_a1',
 'BEAM0011/rx_processing/rg_eg_sigma_error_a2',
 'BEAM0011/rx_processing/rg_eg_sigma_error_a3',
 'BEAM0011/rx_processing/rg_eg_sigma_error_a4',
 'BEAM0011/rx_processing/rg_eg_sigma_error_a5',
 'BEAM0011/rx_processing/rg_eg_sigma_error_a6',
 'BEAM0011/rx_processing/rg_error_a1',
 'BEAM0011/rx_processing/rg_error_a2',
 'BEAM0011/rx_processing/rg_error_a3',
 'BEAM0011/rx_processing/rg_error_a4',
 'BEAM0011/rx_processing/rg_error_a5',
 'BEAM0011/rx_processing/rg_error_a6',
 'BEAM0011/rx_processing/rv_a1',
 'BEAM0011/rx_processing/rv_a2',
 'BEAM0011/rx_processing/rv_a3',
 'BEAM0011/rx_processing/rv_a4',
 'BEAM0011/rx_processing/rv_a5',
 'BEAM0011/rx_processing/rv_a6',
 'BEAM0011/rx_processing/rx_energy_a1',
 'BEAM0011/rx_processing/rx_energy_a2',
 'BEAM0011/rx_processing/rx_energy_a3',
 'BEAM0011/rx_processing/rx_energy_a4',
 'BEAM0011/rx_processing/rx_energy_a5',
 'BEAM0011/rx_processing/rx_energy_a6',
 'BEAM0011/rx_processing/shot_number',
 'BEAM0011/rx_range_highestreturn',
 'BEAM0011/rx_sample_count',
 'BEAM0011/rx_sample_start_index',
 'BEAM0011/selected_l2a_algorithm',
 'BEAM0011/selected_mode',
 'BEAM0011/selected_mode_flag',
 'BEAM0011/selected_rg_algorithm',
 'BEAM0011/sensitivity',
 'BEAM0011/shot_number',
 'BEAM0011/stale_return_flag',
 'BEAM0011/surface_flag',
 'BEAM0101/algorithmrun_flag',
 'BEAM0101/ancillary/dz',
 'BEAM0101/ancillary/l2a_alg_count',
 'BEAM0101/ancillary/maxheight_cuttoff',
 'BEAM0101/ancillary/rg_eg_constraint_center_buffer',
 'BEAM0101/ancillary/rg_eg_mpfit_max_func_evals',
 'BEAM0101/ancillary/rg_eg_mpfit_maxiters',
 'BEAM0101/ancillary/rg_eg_mpfit_tolerance',
 'BEAM0101/ancillary/signal_search_buff',
 'BEAM0101/ancillary/tx_noise_stddev_multiplier',
 'BEAM0101/beam',
 'BEAM0101/channel',
 'BEAM0101/cover',
 'BEAM0101/cover_z',
 'BEAM0101/fhd_normal',
 'BEAM0101/geolocation/degrade_flag',
 'BEAM0101/geolocation/delta_time',
 'BEAM0101/geolocation/digital_elevation_model',
 'BEAM0101/geolocation/elev_highestreturn',
 'BEAM0101/geolocation/elev_lowestmode',
 'BEAM0101/geolocation/elevation_bin0',
 'BEAM0101/geolocation/elevation_bin0_error',
 'BEAM0101/geolocation/elevation_lastbin',
 'BEAM0101/geolocation/elevation_lastbin_error',
 'BEAM0101/geolocation/height_bin0',
 'BEAM0101/geolocation/height_lastbin',
 'BEAM0101/geolocation/lat_highestreturn',
 'BEAM0101/geolocation/lat_lowestmode',
 'BEAM0101/geolocation/latitude_bin0',
 'BEAM0101/geolocation/latitude_bin0_error',
 'BEAM0101/geolocation/latitude_lastbin',
 'BEAM0101/geolocation/latitude_lastbin_error',
 'BEAM0101/geolocation/local_beam_azimuth',
 'BEAM0101/geolocation/local_beam_elevation',
 'BEAM0101/geolocation/lon_highestreturn',
 'BEAM0101/geolocation/lon_lowestmode',
 'BEAM0101/geolocation/longitude_bin0',
 'BEAM0101/geolocation/longitude_bin0_error',
 'BEAM0101/geolocation/longitude_lastbin',
 'BEAM0101/geolocation/longitude_lastbin_error',
 'BEAM0101/geolocation/shot_number',
 'BEAM0101/geolocation/solar_azimuth',
 'BEAM0101/geolocation/solar_elevation',
 'BEAM0101/l2a_quality_flag',
 'BEAM0101/l2b_quality_flag',
 'BEAM0101/land_cover_data/landsat_treecover',
 'BEAM0101/land_cover_data/landsat_water_persistence',
 'BEAM0101/land_cover_data/leaf_off_doy',
 'BEAM0101/land_cover_data/leaf_off_flag',
 'BEAM0101/land_cover_data/leaf_on_cycle',
 'BEAM0101/land_cover_data/leaf_on_doy',
 'BEAM0101/land_cover_data/modis_nonvegetated',
 'BEAM0101/land_cover_data/modis_nonvegetated_sd',
 'BEAM0101/land_cover_data/modis_treecover',
 'BEAM0101/land_cover_data/modis_treecover_sd',
 'BEAM0101/land_cover_data/pft_class',
 'BEAM0101/land_cover_data/region_class',
 'BEAM0101/land_cover_data/urban_focal_window_size',
 'BEAM0101/land_cover_data/urban_proportion',
 'BEAM0101/master_frac',
 'BEAM0101/master_int',
 'BEAM0101/num_detectedmodes',
 'BEAM0101/omega',
 'BEAM0101/pai',
 'BEAM0101/pai_z',
 'BEAM0101/pavd_z',
 'BEAM0101/pgap_theta',
 'BEAM0101/pgap_theta_error',
 'BEAM0101/pgap_theta_z',
 'BEAM0101/rg',
 'BEAM0101/rh100',
 'BEAM0101/rhog',
 'BEAM0101/rhog_error',
 'BEAM0101/rhov',
 'BEAM0101/rhov_error',
 'BEAM0101/rossg',
 'BEAM0101/rv',
 'BEAM0101/rx_processing/algorithmrun_flag_a1',
 'BEAM0101/rx_processing/algorithmrun_flag_a2',
 'BEAM0101/rx_processing/algorithmrun_flag_a3',
 'BEAM0101/rx_processing/algorithmrun_flag_a4',
 'BEAM0101/rx_processing/algorithmrun_flag_a5',
 'BEAM0101/rx_processing/algorithmrun_flag_a6',
 'BEAM0101/rx_processing/pgap_theta_a1',
 'BEAM0101/rx_processing/pgap_theta_a2',
 'BEAM0101/rx_processing/pgap_theta_a3',
 'BEAM0101/rx_processing/pgap_theta_a4',
 'BEAM0101/rx_processing/pgap_theta_a5',
 'BEAM0101/rx_processing/pgap_theta_a6',
 'BEAM0101/rx_processing/pgap_theta_error_a1',
 'BEAM0101/rx_processing/pgap_theta_error_a2',
 'BEAM0101/rx_processing/pgap_theta_error_a3',
 'BEAM0101/rx_processing/pgap_theta_error_a4',
 'BEAM0101/rx_processing/pgap_theta_error_a5',
 'BEAM0101/rx_processing/pgap_theta_error_a6',
 'BEAM0101/rx_processing/rg_a1',
 'BEAM0101/rx_processing/rg_a2',
 'BEAM0101/rx_processing/rg_a3',
 'BEAM0101/rx_processing/rg_a4',
 'BEAM0101/rx_processing/rg_a5',
 'BEAM0101/rx_processing/rg_a6',
 'BEAM0101/rx_processing/rg_eg_amplitude_a1',
 'BEAM0101/rx_processing/rg_eg_amplitude_a2',
 'BEAM0101/rx_processing/rg_eg_amplitude_a3',
 'BEAM0101/rx_processing/rg_eg_amplitude_a4',
 'BEAM0101/rx_processing/rg_eg_amplitude_a5',
 'BEAM0101/rx_processing/rg_eg_amplitude_a6',
 'BEAM0101/rx_processing/rg_eg_amplitude_error_a1',
 'BEAM0101/rx_processing/rg_eg_amplitude_error_a2',
 'BEAM0101/rx_processing/rg_eg_amplitude_error_a3',
 'BEAM0101/rx_processing/rg_eg_amplitude_error_a4',
 'BEAM0101/rx_processing/rg_eg_amplitude_error_a5',
 'BEAM0101/rx_processing/rg_eg_amplitude_error_a6',
 'BEAM0101/rx_processing/rg_eg_center_a1',
 'BEAM0101/rx_processing/rg_eg_center_a2',
 'BEAM0101/rx_processing/rg_eg_center_a3',
 'BEAM0101/rx_processing/rg_eg_center_a4',
 'BEAM0101/rx_processing/rg_eg_center_a5',
 'BEAM0101/rx_processing/rg_eg_center_a6',
 'BEAM0101/rx_processing/rg_eg_center_error_a1',
 'BEAM0101/rx_processing/rg_eg_center_error_a2',
 'BEAM0101/rx_processing/rg_eg_center_error_a3',
 'BEAM0101/rx_processing/rg_eg_center_error_a4',
 'BEAM0101/rx_processing/rg_eg_center_error_a5',
 'BEAM0101/rx_processing/rg_eg_center_error_a6',
 'BEAM0101/rx_processing/rg_eg_chisq_a1',
 'BEAM0101/rx_processing/rg_eg_chisq_a2',
 'BEAM0101/rx_processing/rg_eg_chisq_a3',
 'BEAM0101/rx_processing/rg_eg_chisq_a4',
 'BEAM0101/rx_processing/rg_eg_chisq_a5',
 'BEAM0101/rx_processing/rg_eg_chisq_a6',
 'BEAM0101/rx_processing/rg_eg_flag_a1',
 'BEAM0101/rx_processing/rg_eg_flag_a2',
 'BEAM0101/rx_processing/rg_eg_flag_a3',
 'BEAM0101/rx_processing/rg_eg_flag_a4',
 'BEAM0101/rx_processing/rg_eg_flag_a5',
 'BEAM0101/rx_processing/rg_eg_flag_a6',
 'BEAM0101/rx_processing/rg_eg_gamma_a1',
 'BEAM0101/rx_processing/rg_eg_gamma_a2',
 'BEAM0101/rx_processing/rg_eg_gamma_a3',
 'BEAM0101/rx_processing/rg_eg_gamma_a4',
 'BEAM0101/rx_processing/rg_eg_gamma_a5',
 'BEAM0101/rx_processing/rg_eg_gamma_a6',
 'BEAM0101/rx_processing/rg_eg_gamma_error_a1',
 'BEAM0101/rx_processing/rg_eg_gamma_error_a2',
 'BEAM0101/rx_processing/rg_eg_gamma_error_a3',
 'BEAM0101/rx_processing/rg_eg_gamma_error_a4',
 'BEAM0101/rx_processing/rg_eg_gamma_error_a5',
 'BEAM0101/rx_processing/rg_eg_gamma_error_a6',
 'BEAM0101/rx_processing/rg_eg_niter_a1',
 'BEAM0101/rx_processing/rg_eg_niter_a2',
 'BEAM0101/rx_processing/rg_eg_niter_a3',
 'BEAM0101/rx_processing/rg_eg_niter_a4',
 'BEAM0101/rx_processing/rg_eg_niter_a5',
 'BEAM0101/rx_processing/rg_eg_niter_a6',
 'BEAM0101/rx_processing/rg_eg_sigma_a1',
 'BEAM0101/rx_processing/rg_eg_sigma_a2',
 'BEAM0101/rx_processing/rg_eg_sigma_a3',
 'BEAM0101/rx_processing/rg_eg_sigma_a4',
 'BEAM0101/rx_processing/rg_eg_sigma_a5',
 'BEAM0101/rx_processing/rg_eg_sigma_a6',
 'BEAM0101/rx_processing/rg_eg_sigma_error_a1',
 'BEAM0101/rx_processing/rg_eg_sigma_error_a2',
 'BEAM0101/rx_processing/rg_eg_sigma_error_a3',
 'BEAM0101/rx_processing/rg_eg_sigma_error_a4',
 'BEAM0101/rx_processing/rg_eg_sigma_error_a5',
 'BEAM0101/rx_processing/rg_eg_sigma_error_a6',
 'BEAM0101/rx_processing/rg_error_a1',
 'BEAM0101/rx_processing/rg_error_a2',
 'BEAM0101/rx_processing/rg_error_a3',
 'BEAM0101/rx_processing/rg_error_a4',
 'BEAM0101/rx_processing/rg_error_a5',
 'BEAM0101/rx_processing/rg_error_a6',
 'BEAM0101/rx_processing/rv_a1',
 'BEAM0101/rx_processing/rv_a2',
 'BEAM0101/rx_processing/rv_a3',
 'BEAM0101/rx_processing/rv_a4',
 'BEAM0101/rx_processing/rv_a5',
 'BEAM0101/rx_processing/rv_a6',
 'BEAM0101/rx_processing/rx_energy_a1',
 'BEAM0101/rx_processing/rx_energy_a2',
 'BEAM0101/rx_processing/rx_energy_a3',
 'BEAM0101/rx_processing/rx_energy_a4',
 'BEAM0101/rx_processing/rx_energy_a5',
 'BEAM0101/rx_processing/rx_energy_a6',
 'BEAM0101/rx_processing/shot_number',
 'BEAM0101/rx_range_highestreturn',
 'BEAM0101/rx_sample_count',
 'BEAM0101/rx_sample_start_index',
 'BEAM0101/selected_l2a_algorithm',
 'BEAM0101/selected_mode',
 'BEAM0101/selected_mode_flag',
 'BEAM0101/selected_rg_algorithm',
 'BEAM0101/sensitivity',
 'BEAM0101/shot_number',
 'BEAM0101/stale_return_flag',
 'BEAM0101/surface_flag',
 'BEAM0110/algorithmrun_flag',
 'BEAM0110/ancillary/dz',
 'BEAM0110/ancillary/l2a_alg_count',
 'BEAM0110/ancillary/maxheight_cuttoff',
 'BEAM0110/ancillary/rg_eg_constraint_center_buffer',
 'BEAM0110/ancillary/rg_eg_mpfit_max_func_evals',
 'BEAM0110/ancillary/rg_eg_mpfit_maxiters',
 'BEAM0110/ancillary/rg_eg_mpfit_tolerance',
 'BEAM0110/ancillary/signal_search_buff',
 'BEAM0110/ancillary/tx_noise_stddev_multiplier',
 'BEAM0110/beam',
 'BEAM0110/channel',
 'BEAM0110/cover',
 'BEAM0110/cover_z',
 'BEAM0110/fhd_normal',
 ...]
In [8]:
len(SDS)
Out[8]:
1576

4. Subset by Layer and Filter by Quality¶

below are the list of datasets will be read and then used to generate a pandas dataframe.¶

Label Description Units
lat_lowestmode Latitude of center of lowest mode degree
lon_lowestmode Longitude of center of lowest mode degree
elev_lowestmode elevation of center of lowest mode relative to reference ellipsoid m
shot_number Unique shot ID counter
l2b_quality_flag Flag simpilfying selection of most useful data for Level 2B** -
degrade_flag Non-zero values indicate the shot occured during a degraded period. A non-zero tens digit indicates degraded attitude, a non-zero ones digit indicates a degraded trajectory. 3X=ADF CHU solution unavailable (ST-2); 4X=Platform attitude; 5X=Poor solution (filter covariance large); 6X=Data outage (platform attitude gap also); 7X=ST 1+2 unavailable (similar boresight FOV); 8X=ST 1+2+3 unavailable; 9X=ST 1+2+3 and ISS unavailable; X1=Maneuver; X2=GPS data gap; X3=ST blinding; X4=Other; X5=GPS receiver clock drift; X6=X5+X1; X7=X5+X2; X8=X5+X3; X9=X5+X4 -
pai Total plant area index m2/m2
rh100 Height above ground of the received waveform signal start (rh[101] from L2A) cm
digital_elevation_model Digital elevation model height above the WGS84 ellipsoid. Interpolated at latitude_bin0 and longitude_bin0 from the TandemX 90m product m
modis_nonvegetated Percent non-vegetated from MODIS data. Interpolated at latitude_bin0 and longitude_bin0 percent

** quality_flag is a summation of several individual quality assessment parameters and other flags and is intended to provide general guidance only. A quality_flag value of 1 indicates the cover and vertical profile metrics represent the land surface and meet criteria based on waveform shot energy, sensitivity, amplitude, and real-time surface tracking quality, and the quality of extended Gaussian fitting to the lowest mode.

In [9]:
columns= ['Beam', 'Shot Number', 'Longitude', 'Latitude', 'Quality Flag', 'Tandem-X DEM',
                                          'Canopy Elevation (m)','Elevation (m)', 'Plant Area Index', 'Canopy Height/rh100 (cm)',
                                          'non-vegetated from MODIS (percent)', 'Degrade Flag']
latslons_all = pandas.DataFrame(columns=columns)

beamNames = ['BEAM0000', 'BEAM0001', 'BEAM0010', 'BEAM0011', 'BEAM0101', 'BEAM0110',  'BEAM1000', 'BEAM1011' ]
for beamname in beamNames:
    # Open the SDS
    lats = L2B[f'{beamname}/geolocation/lat_lowestmode'][()]
    lons = L2B[f'{beamname}/geolocation/lon_lowestmode'][()]
    elevs = L2B[f'{beamname}/geolocation/elev_lowestmode'][()]
    shots = L2B[f'{beamname}/geolocation/shot_number'][()].astype(str)
    quality = L2B[f'{beamname}/l2b_quality_flag'][()]
    pai = L2B[f'{beamname}/pai'][()]
    rh100 = L2B[f'{beamname}/rh100'][()]
    degrade_flag = L2B[f'{beamname}/geolocation/degrade_flag'][()] 
    dem =  L2B[f'{beamname}/geolocation/digital_elevation_model'][()]
    canopy = L2B[f'{beamname}/geolocation/elev_highestreturn'][()]
    modis_veg = L2B[f'{beamname}/land_cover_data/modis_nonvegetated'][()]

    latslons = pandas.DataFrame({'Beam':beamname, 'Shot Number':shots, 'Longitude':lons, 'Latitude':lats, 'Quality Flag':quality,
                                 'Tandem-X DEM':dem, 'Canopy Elevation (m)':canopy, 'Elevation (m)':elevs, 'Plant Area Index':pai, 
                                 'Canopy Height/rh100 (cm)':rh100, 'non-vegetated from MODIS (percent)':modis_veg, 'Degrade Flag':degrade_flag}) 
        

    latslons_all = pandas.concat([latslons_all, latslons],join="inner")

latslons_all
Out[9]:
Beam Shot Number Longitude Latitude Quality Flag Tandem-X DEM Canopy Elevation (m) Elevation (m) Plant Area Index Canopy Height/rh100 (cm) non-vegetated from MODIS (percent) Degrade Flag
0 BEAM0000 191450000200044950 -134.826959 20.454284 0 -999999.000000 8690.881836 8690.881836 -9999.000000 0 -9999.0 0
1 BEAM0000 191450000200044951 -134.826788 20.454486 0 -999999.000000 8690.892578 8690.892578 -9999.000000 0 -9999.0 0
2 BEAM0000 191450000200044952 -134.826616 20.454687 0 -999999.000000 8690.902344 8690.902344 -9999.000000 0 -9999.0 0
3 BEAM0000 191450000200044953 -134.826445 20.454889 0 -999999.000000 8690.913086 8690.913086 -9999.000000 0 -9999.0 0
4 BEAM0000 191450000200044954 -134.826274 20.455091 0 -999999.000000 8691.520508 8691.520508 -9999.000000 0 -9999.0 0
... ... ... ... ... ... ... ... ... ... ... ... ...
116686 BEAM1011 191451100200157799 -66.732469 51.778879 0 575.726562 2517.487549 2480.030518 -9999.000000 3745 11.0 0
116687 BEAM1011 191451100200157800 -66.731667 51.778883 0 577.237915 2457.362305 2456.914062 -9999.000000 43 11.0 0
116688 BEAM1011 191451100200157801 -66.730790 51.778890 0 577.237915 2527.554688 2499.284668 -9999.000000 2827 11.0 0
116689 BEAM1011 191451100200157802 -66.729918 51.778898 0 580.382568 2560.982666 2536.708496 4.039585 2427 11.0 0
116690 BEAM1011 191451100200157803 -66.729060 51.778904 0 581.518860 2568.459717 2561.886963 -9999.000000 657 25.0 0

948552 rows × 12 columns

Below, is the plot of entire sub-orbit included in this granule. Plotting this could take a long time, and might include information that we do not need necessarily. So lets make a subset of data to only keep the data we need.

image.png

below, the shots that occured during a degraded period and low quality are removed from the dataframe.¶

In [10]:
latslons_all  = latslons_all [latslons_all ['Degrade Flag'] == 0].drop(columns = 'Degrade Flag') 
latslons_all = latslons_all [latslons_all['Quality Flag'] == 1].drop(columns = 'Quality Flag') 
 
In [11]:
# reset the index and drop the NAs


latslons_all = latslons_all[latslons_all['Tandem-X DEM'] != -999999.0]
latslons_all = latslons_all[latslons_all['non-vegetated from MODIS (percent)'] != -9999.0] 
latslons_all = latslons_all.dropna() 
latslons_all = latslons_all.reset_index(drop=True)
latslons_all
Out[11]:
Beam Shot Number Longitude Latitude Tandem-X DEM Canopy Elevation (m) Elevation (m) Plant Area Index Canopy Height/rh100 (cm) non-vegetated from MODIS (percent)
0 BEAM0000 191450000200081940 -120.463823 34.488103 199.594803 196.925323 183.583496 1.352260 1334 15.0
1 BEAM0000 191450000200081941 -120.463359 34.488465 199.621231 210.334656 203.645050 0.295318 667 15.0
2 BEAM0000 191450000200081949 -120.459737 34.491300 213.059143 228.421555 209.324432 1.824727 1909 9.0
3 BEAM0000 191450000200081950 -120.459272 34.491663 235.767044 244.728012 230.078156 1.431416 1464 9.0
4 BEAM0000 191450000200081951 -120.458817 34.492019 235.767044 243.235764 234.864410 0.475982 836 6.0
... ... ... ... ... ... ... ... ... ... ...
274530 BEAM1011 191451100200155427 -68.703371 51.748007 509.907318 513.940735 506.507111 1.281197 742 32.0
274531 BEAM1011 191451100200155428 -68.702538 51.748026 515.884949 522.243958 512.270203 0.228271 997 37.0
274532 BEAM1011 191451100200155429 -68.701715 51.748045 514.225098 523.028931 510.178894 0.794760 1285 37.0
274533 BEAM1011 191451100200155430 -68.700894 51.748064 514.225098 519.418213 506.007843 0.680019 1340 37.0
274534 BEAM1011 191451100200155431 -68.700070 51.748083 509.531982 516.337219 504.495789 0.486418 1184 37.0

274535 rows × 10 columns

5. Create a Geodataframe and Subset Spatially¶

Below, an additional column is created and called 'geometry' that contains a shapely point generated from each lat/lon location from the shot is created. Next, the dataframe is converted to a Geopandas GeoDataFrame.¶

In [12]:
# Take the lat/lon dataframe and convert each lat/lon to a shapely point and convert to a Geodataframe
latslons_all = geopandas.GeoDataFrame(latslons_all, geometry=latslons_all.apply(lambda row: Point(row.Longitude, row.Latitude), axis=1))
latslons_all = latslons_all.set_crs('EPSG:4326')

Import a GeoJSON of a small eastern section of Uinta-Wasatch-Cache National Forest as an additional GeoDataFrame.¶

In [13]:
ROI = geopandas.GeoDataFrame.from_file('NationalForest.geojson')
ROI.crs = 'EPSG:4326'

Next, filter the shots that are within the ROI boundaries.¶

In [14]:
shot_list = []
for num, geom in enumerate(latslons_all['geometry']):
    if ROI.contains(geom)[0]:
        shot_n = latslons_all.loc[num, 'Shot Number']
        shot_list.append(shot_n)
In [15]:
DF = latslons_all.where(latslons_all['Shot Number'].isin(shot_list))
DF = DF.reset_index(drop=True).dropna()
In [16]:
DF
Out[16]:
Beam Shot Number Longitude Latitude Tandem-X DEM Canopy Elevation (m) Elevation (m) Plant Area Index Canopy Height/rh100 (cm) non-vegetated from MODIS (percent) geometry
8944 BEAM0000 191450000200100445 -111.263042 40.692563 2007.632080 2015.287842 2009.384521 0.276865 590 20.0 POINT (-111.26304 40.69256)
8945 BEAM0000 191450000200100446 -111.262499 40.692874 2012.697021 2019.093872 2013.003784 0.120738 609 20.0 POINT (-111.26250 40.69287)
8946 BEAM0000 191450000200100447 -111.261956 40.693185 2018.024170 2022.015381 2016.934082 0.090340 507 19.0 POINT (-111.26196 40.69319)
8947 BEAM0000 191450000200100449 -111.260871 40.693807 2022.398193 2029.190552 2022.913696 0.316465 626 19.0 POINT (-111.26087 40.69381)
8948 BEAM0000 191450000200100450 -111.260329 40.694117 2028.278809 2031.693481 2026.051758 0.269103 563 19.0 POINT (-111.26033 40.69412)
... ... ... ... ... ... ... ... ... ... ... ...
251324 BEAM1011 191451100200096272 -110.799421 40.906476 2648.858887 2661.588135 2641.007568 0.558181 2057 13.0 POINT (-110.79942 40.90648)
251325 BEAM1011 191451100200096273 -110.798881 40.906781 2648.858887 2656.045166 2635.277832 0.276846 2076 12.0 POINT (-110.79888 40.90678)
251326 BEAM1011 191451100200096274 -110.798337 40.907088 2636.217285 2651.862549 2633.971191 0.162534 1788 12.0 POINT (-110.79834 40.90709)
251327 BEAM1011 191451100200096275 -110.797793 40.907395 2636.313477 2652.544678 2633.196777 0.630030 1934 12.0 POINT (-110.79779 40.90740)
251328 BEAM1011 191451100200096276 -110.797250 40.907702 2636.313477 2643.638672 2631.611572 0.157591 1202 7.0 POINT (-110.79725 40.90770)

5890 rows × 11 columns

In [17]:
All_DF = geopandas.GeoDataFrame(DF).drop(columns=['Longitude', 'Latitude'])

6. Visualize a GeoDataFrame¶

In this section, the GeoDataFrame and the geoviews python package are used to spatially visualize the location of the GEDI shots on a basemap layer and import a GeoJSON file of the spatial region of interest for this use case example.¶

Defining the vdims below will allow you to hover over specific shots and view information about them.¶

In [18]:
# Create a list of geodataframe columns to be included as attributes in the output map
vdims = []
for f in All_DF:
    if f not in ['geometry']:
        vdims.append(f)

        vdims
In [19]:
# Define a function for visualizing GEDI points
def pointVisual(features, vdims):
    return (gvts.EsriImagery * geoviews.Points(features, vdims=vdims).options(tools=['hover'], height=500, width=900, size=4, 
                                                                        color='yellow', fontsize={'xticks': 10, 'yticks': 10, 
                                                                                                  'xlabel':16, 'ylabel': 16}))
# Visualize GEDI data
geoviews.Polygons(ROI['geometry']).opts(line_color='red', color=None)* pointVisual(All_DF, vdims = vdims)
Out[19]:

Below, the shots are mapped to enable selection of datasets using dropdown menu to better visualize the spatial variations for each dataset.¶

In [20]:
import panel 
panel.extension()

mask_name = panel.widgets.Select(name='Datasets',options=vdims, value='Elevation (m)', disabled_options=['Beam', 'Shot Number'])
In [21]:
@panel.depends(mask_name)
def visual_map(mask_name):
    map = (gvts.EsriImagery * geoviews.Points(All_DF,
                                              vdims=vdims).options(color=mask_name,
                                                                   cmap='gnuplot', size=4, tools=['hover'],
                                                                   clim=(int(min(DF[mask_name])), 
                                                                         round(max(DF[mask_name]))),
                                                                   colorbar=True, 
                                                                   title=f'{mask_name} (Wasatch-Cache National Forest): Apr 30, 2022',
                                                                   fontsize={'xticks': 10, 'yticks': 10, 'xlabel':16, 'clabel':12,
                                                                             'cticks':10,'title':10,
                                                                             'ylabel':16})).options(height=500,width=700)
    return map 

panel.Row(panel.WidgetBox(mask_name), visual_map)
Out[21]:

7. Export Subsets as GeoJSON Files¶

Finally, export the GeoDataFrame as a .geojson file that can be easily opened in your favorite remote sensing and/or GIS software and will include an attribute table with all of the shots/values for each of the SDS layers in the dataframe.¶

In [22]:
outName = L2B.filename.replace('.h5', '.geojson')  # Create an output file name using the input file name
print(outName)
All_DF.to_file(outName, driver='GeoJSON')  # Export to GeoJSON
GEDI02_B_2022120091720_O19145_02_T09106_02_003_01_V002.geojson
In [ ]: